home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 24 / CU Amiga Magazine's Super CD-ROM 24 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-07].iso / CUCD / Programming / SWI / source / src / pl-buffer.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  2.1 KB  |  74 lines

  1. /*  $Id: pl-buffer.h,v 1.8 1997/05/06 09:59:58 jan Exp $
  2.  
  3.     Designed and implemented by Jan Wielemaker
  4.     E-mail: jan@swi.psy.uva.nl
  5.  
  6.     Copyright (C) 1993 University of Amsterdam. All rights reserved.
  7. */
  8.  
  9. #define STATIC_BUFFER_SIZE (512)
  10.  
  11. typedef struct
  12. { char *    base;            /* allocated base */
  13.   char *    top;            /* pointer to top */
  14.   char *    max;            /* current location */
  15.   char        static_buffer[STATIC_BUFFER_SIZE];
  16. } tmp_buffer, *TmpBuffer;
  17.  
  18. typedef struct
  19. { char *    base;            /* allocated base */
  20.   char *    top;            /* pointer to top */
  21.   char *    max;            /* current location */
  22.   char        static_buffer[sizeof(char *)];
  23. } buffer, *Buffer;
  24.  
  25. void    growBuffer(Buffer, long);
  26.  
  27. #define addBuffer(b, obj, type) \
  28.     do \
  29.     { if ( (b)->top + sizeof(type) > (b)->max ) \
  30.         growBuffer((Buffer)b, sizeof(type)); \
  31.        *((type *)(b)->top) = obj; \
  32.           (b)->top += sizeof(type); \
  33.     } while(0)
  34.   
  35. #define addUnalignedBuffer(b, obj, type) \
  36.     do \
  37.     { if ( (b)->top + sizeof(type) > (b)->max ) \
  38.         growBuffer((Buffer)b, sizeof(type)); \
  39.       memcpy((b)->top, (char *)&obj, sizeof(type)); \
  40.           (b)->top += sizeof(type); \
  41.     } while(0)
  42.   
  43. #define addMultipleBuffer(b, ptr, times, type) \
  44.     do \
  45.     { int len = sizeof(type) * (times); \
  46.       if ( (b)->top + len > (b)->max ) \
  47.         growBuffer((Buffer)b, len); \
  48.       memcpy((b)->top, ptr, len); \
  49.           (b)->top += len; \
  50.     } while(0)
  51.   
  52. #define baseBuffer(b, type)     ((type *) (b)->base)
  53. #define topBuffer(b, type)       ((type *) (b)->top)
  54. #define inBuffer(b, addr)        ((char *) (addr) >= (b)->base && \
  55.                   (char *) (addr)  < (b)->top)
  56. #define fetchBuffer(b, i, type)     (baseBuffer(b, type)[i])
  57.  
  58. #define seekBuffer(b, cnt, type) ((b)->top = sizeof(type) * (cnt) + (b)->base)
  59. #define sizeOfBuffer(b)          ((b)->top - (b)->base)
  60. #define freeSpaceBuffer(b)     ((b)->max - (b)->top)
  61. #define entriesBuffer(b, type)   (sizeOfBuffer(b) / sizeof(type))
  62. #define initBuffer(b)            ((b)->base = (b)->top = (b)->static_buffer, \
  63.                   (b)->max = (b)->base + \
  64.                   sizeof((b)->static_buffer))
  65. #define emptyBuffer(b)           ((b)->top  = (b)->base)
  66.  
  67. #define discardBuffer(b) \
  68.     do \
  69.     { if ( (b)->base != (b)->static_buffer ) \
  70.         free((b)->base); \
  71.     } while(0)
  72.  
  73.  
  74.